#ifndef GAMEENGINE_CORE_DATA_TYPE_HPP
#define GAMEENGINE_CORE_DATA_TYPE_HPP

#ifdef GAMEENGINE_NAMESPACES
namespace GameEngine {
#endif

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 */
template <class T>
DataType DataTypes<T>::get_type() {
	return Custom;
}

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 @note This is the partial specialization for type boolean
 */
template <>
DataType DataTypes<bool>::get_type() {
	return Boolean;
}

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 @note This is the partial specialization for type short
 */
template <>
DataType DataTypes<short>::get_type() {
	return ShortInteger;
}

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 @note This is the partial specialization for type unsigned short
 */
template <>
DataType DataTypes<unsigned short>::get_type() {
	return UnsignedShortInteger;
}

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 @note This is the partial specialization for type integer
 */
template <>
DataType DataTypes<int>::get_type() {
	return Integer;
}

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 @note This is the partial specialization for type unsigned integer
 */
template <>
DataType DataTypes<unsigned int>::get_type() {
	return UnsignedInteger;
}

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 @note This is the partial specialization for type long
 */
template <>
DataType DataTypes<long>::get_type() {
	return LongInteger;
}

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 @note This is the partial specialization for type unsigned long integer
 */
template <>
DataType DataTypes<unsigned long>::get_type() {
	return UnsignedLongInteger;
}

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 @note This is the partial specialization for type char
 */
template <>
DataType DataTypes<char>::get_type() {
	return Char;
}

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 @note This is the partial specialization for type unsigned char
 */
template <>
DataType DataTypes<unsigned char>::get_type() {
	return UnsignedChar;
}

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 @note This is the partial specialization for type float
 */
template <>
DataType DataTypes<float>::get_type() {
	return Float;
}

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 @note This is the partial specialization for type double
 */
template <>
DataType DataTypes<double>::get_type() {
	return Double;
}

//! Get the data type code associated to type T
/*!
 @return The data type code associated to type T
 @note This is the partial specialization for type long double
 */
template <>
DataType DataTypes<long double>::get_type() {
	return LongDouble;
}

#ifdef GAMEENGINE_NAMESPACES
} // namespace GameEngine
#endif

#endif
